package redis

import (
	"github.com/garyburd/redigo/redis"
	. "my-crawler/config"
	"my-crawler/pkh"
)

var RedistPool *redis.Pool //创建redis连接池
var Prefix string

func init() {
	config := LoadConfig()
	Prefix = config.RedisConn.Prefix
	RedistPool = &redis.Pool{ //实例化一个连接池
		MaxIdle:     16,  //最初的连接数量
		MaxActive:   0,   //连接池最大连接数量,不确定可以用0（0表示自动定义），按需分配
		IdleTimeout: 300, //连接关闭时间 300秒 （300秒不使用自动关闭）
		Dial: func() (redis.Conn, error) { //要连接的redis数据库
			c, error := redis.Dial("tcp", config.RedisConn.Address+":"+config.RedisConn.Port)
			c.Do("AUTH", config.RedisConn.Password)
			return c, error
		},
	}
}

func Set(key string, val interface{}) {
	pool := RedistPool.Get()
	_, err := pool.Do("Set", Prefix+key, val)
	common.Check(err)
}

func Get(key string) (val string) {
	pool := RedistPool.Get()
	val, err := redis.String(pool.Do("GET", Prefix+key))
	common.Check(err)
	return val
}

func SAdd(key string, val string) {
	pool := RedistPool.Get()
	_, err := pool.Do("SAdd", Prefix+key, val)
	common.Check(err)
}

//获取集合元素个数
func SCard(key string) (number int) {
	pool := RedistPool.Get()
	number, err := redis.Int(pool.Do("SCard", Prefix+key))
	common.Check(err)
	return number
}

//判断元素是否在集合中
func SIsMember(key string, val interface{}) (res bool) {
	pool := RedistPool.Get()
	res, err := redis.Bool(pool.Do("SIsMember", Prefix+key, val))
	common.Check(err)
	return res
}

//获取集合所有元素
func SMembers(key string) (val []interface{}) {
	pool := RedistPool.Get()
	res, err := redis.Values(pool.Do("SMembers", Prefix+key))
	common.Check(err)
	return res
}

//删除集合中的元素
func SRem(key string, val interface{}) (bool bool) {
	pool := RedistPool.Get()
	bool, err := redis.Bool(pool.Do("SRem", Prefix+key, val))
	common.Check(err)
	return bool
}

/*

// 删除集合中的元素tizi和2019
client.SRem("key", "tizi", "2019")
6.SPop,SPopN
随机返回集合中的元素，并且删除返回的元素

// 随机返回集合中的一个元素，并且删除这个元素
val, _ := client.SPop("key").Result()
fmt.Println(val)

// 随机返回集合中的5个元素，并且删除这些元素
vals, _ := client.SPopN("key", 5).Result()
fmt.Println(vals)
*/
